package com.atguigu.gmall.index.time;

import javafx.concurrent.Task;
import org.springframework.scheduling.annotation.EnableScheduling;

import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
 * 定时器测试类
 *每隔十秒打印系统当前时间
 * @author Jia Fa
 * @create 2021-12-12 20:32
 */

public class timerTest {
    // 定时任务执行单次  方法几乎与线程池一致 线程池过于笨重
    public static void main(String[] args) {
        Timer timer = new Timer();
        System.out.println(System.currentTimeMillis());
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println(System.currentTimeMillis());
            }
        }, 10000);
    }

    // springBoot 自带的定时器注解
    /** 在启动类上添加 @EnableScheduling 开启定时任务功能
     *  定时任务的添加只需要使用 @Scheduled 注解标注即可  在方法上声明该注解
     *  @Scheduled(cron = "59 59 23 0 0 5") // cron 表达式，每周五 23:59:59 执行
     * @param args
     */

    // 使用的是JUC中线程池Executors工具类的newScheduledThreadPool初始化一个定时任务线程方法  此方法优于Timer
    /*public static void main(String[] args) {
        // 注意 此方法可能导致OOM
        // 创建任务队列
        ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(10); // 初始化10个线程

        scheduledExecutorService.scheduleAtFixedRate(()->{
            System.out.println(System.currentTimeMillis());
        }, 5, 10, TimeUnit.SECONDS);   // 5秒后开始执行 每10s执行一次
    }*/



    // while(true) 实现定时任务
    /*public static void main(String[] args) {
        while (true) {
            System.out.println(System.currentTimeMillis());
            try {
                Thread.sleep(10000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }*/
    // timer类实现定时任务
   /* public static void main(String[] args) {
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                // 系统当前时间 每隔十秒打印一次
                System.out.println(System.currentTimeMillis());
            }
        }, 10000, 10000);
    }*/
}

